package com.dlc.felear.xiaoensale.factory;

import com.dlc.felear.xiaoensale.utils.HexUtil;

/**
 * 指令工厂- 拼接指令
 * Created by felear on 2018/8/6.
 */

public class OrderFactory {

    private static final String TAG = "OrderFactory";


    /**
     * 查询FAYA控制板
     *
     * @return
     */
    public static byte[] queryWeight1(int add) {
        byte[] bytes = new byte[8];
        bytes[0] = (byte) add;
        bytes[1] = (byte) 0x03;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) 0x05;
        bytes[4] = (byte) 0x00;
        bytes[5] = (byte) 0x02;
        checkCRC16(bytes);
        return bytes;
    }

    /**
     * 非去皮状态下发1去皮 去皮状态下发1取消去皮
     *
     * @param add
     * @return
     */
    public static byte[] tieboshiClearZreo(int add) {
//        01 10 00 0F 00 02 04 00 00 00 00 B3 EF
        byte[] bytes = new byte[11];
        bytes[0] = (byte) add;
        bytes[1] = (byte) 0x10;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) 0x35;
        bytes[4] = (byte) 0x00;
        bytes[5] = (byte) 0x01;
        bytes[6] = (byte) 0x02;
        bytes[7] = (byte) 0x00;
        bytes[8] = (byte) 0x01;
        checkCRC16(bytes);
        return bytes;
    }

    /**
     * 设置传感器方向
     *
     * @param add
     * @return
     */
    public static byte[] tieboshiDirect(int add) {
        byte[] bytes = new byte[11];
        bytes[0] = (byte) add;
        bytes[1] = (byte) 0x10;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) 0x2B;
        bytes[4] = (byte) 0x00;
        bytes[5] = (byte) 0x01;
        bytes[6] = (byte) 0x02;
        bytes[7] = (byte) 0x00;
        bytes[8] = (byte) 0x01;
        checkCRC16(bytes);
        return bytes;
    }

    /**
     * 置零 0 常规置零 1强制置零
     *
     * @param add
     * @return
     */
    public static byte[] tieboshiResetZero(int add, int value) {
        byte[] bytes = new byte[13];
        bytes[0] = (byte) add;
        bytes[1] = (byte) 0x10;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) 0x0F;
        bytes[4] = (byte) 0x00;
        bytes[5] = (byte) 0x02;
        bytes[6] = (byte) 0x04;
        bytes[7] = (byte) 0x00;
        bytes[8] = (byte) 0x00;
        bytes[7] = (byte) 0x00;
        bytes[8] = (byte) value;
        checkCRC16(bytes);
        return bytes;
    }
    /**
     * 去皮
     *
     * @param add
     * @return
     */
    public static byte[] tieboshiQuPi(int add) {
        byte[] bytes = new byte[11];
        bytes[0] = (byte) add;
        bytes[1] = (byte) 0x10;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) 0x35;
        bytes[4] = (byte) 0x00;
        bytes[5] = (byte) 0x01;
        bytes[6] = (byte) 0x02;
        bytes[7] = (byte) 0x00;
        bytes[8] = (byte) 0x01;
        checkCRC16(bytes);
        return bytes;
    }

    /**
     * 标定0点
     *
     * @param add
     * @return
     */
    public static byte[] tieboshiBiaoDZero(int add) {
        byte[] bytes = new byte[13];
        bytes[0] = (byte) add;
        bytes[1] = (byte) 0x10;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) 0x0F;
        bytes[4] = (byte) 0x00;
        bytes[5] = (byte) 0x02;
        bytes[6] = (byte) 0x04;
        bytes[7] = (byte) 0x00;
        bytes[8] = (byte) 0x00;
        bytes[9] = (byte) 0x00;
        bytes[10] = (byte) 0x00;
        checkCRC16(bytes);
        return bytes;
    }
    /**
     * 标定0点
     *
     * @param add
     * @return
     */
    public static byte[] tieboshiBiaoDFz(int add,int weight) {
        byte[] bytes = new byte[13];
        bytes[0] = (byte) add;
        bytes[1] = (byte) 0x10;
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) 0x0F;
        bytes[4] = (byte) 0x00;
        bytes[5] = (byte) 0x02;
        bytes[6] = (byte) 0x04;
        bytes[7] = (byte) 0x00;
        bytes[8] = (byte) 0x00;
        byte[] temp=HexUtil.intTwoBytes(weight);
        bytes[9] = temp[1];
        bytes[10] = temp[0];
        checkCRC16(bytes);
        return bytes;
    }

    /**
     * 查询FAYA控制板
     *
     * @param num 几号称
     * @return
     */
    public static byte[] queryWeight(int num) {
        byte[] bytes = new byte[8];
        //地址码
        bytes[0] = (byte) num;
        //功能码
        bytes[1] = (byte) 0x03;
        //寄存器地址
        bytes[2] = 0x00;
        bytes[3] = 0x01;
        //数据长度
        bytes[4] = 0x00;
        bytes[5] = 0x01;
        checkCRC16(bytes);
        return bytes;
    }


    /**
     * 打开继电器
     */
    public static byte[] openBzz(int addr) {
//        01 05 00 01 FF 00 DD FA
//        01 05 02 00 07 00 CE 42  //700MS = 7*100MS = 700MS
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x05;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x01;
        sendData[4] = (byte) 0xFF;
        sendData[5] = (byte) 0x00;
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] closeBzz(int addr) {
//        01 05 00 01 00 00 9C 0A
        byte[] sendData = new byte[8];
        sendData[0] = (byte) addr;
        sendData[1] = (byte) 0x05;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x01;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x00;
        checkCRC16(sendData);
        return sendData;
    }

    public static byte[] setBzzAddr(int add) {
//        00 10 00 00 00 01 02 00 01 6A 00
        byte[] sendData = new byte[11];
        sendData[0] = (byte) 0x00;
        sendData[1] = (byte) 0x10;
        sendData[2] = (byte) 0x00;
        sendData[3] = (byte) 0x00;
        sendData[4] = (byte) 0x00;
        sendData[5] = (byte) 0x01;
        sendData[6] = (byte) 0x02;
        sendData[7] = (byte) 0x00;
        //地址
        sendData[8] = (byte) add;
        checkCRC16(sendData);
        return sendData;
    }


    //校验码CRC16
    public static void checkCRC16(byte[] bytes) {
        int crc = 0xffff;
        for (int i = 0; i < bytes.length - 2; i++) {
            crc ^= (bytes[i] & 0xff);
            for (int j = 0; j < 8; j++) {
                if ((crc & 1) == 1) {
                    crc >>= 1;
                    crc ^= 0xa001;
                } else {
                    crc >>= 1;
                }
            }
        }
        // 取高低位
        bytes[bytes.length - 1] = (byte) (crc >> 8);
        bytes[bytes.length - 2] = (byte) crc;
    }

    /**
     * 16位的crc校验
     *
     * @param bytes
     * @return
     */
    public static boolean checkDataComplete(byte[] bytes) {

        int crc = 0xffff;
        for (int i = 0; i < bytes.length - 2; i++) {
            crc ^= (bytes[i] & 0xff);
            for (int j = 0; j < 8; j++) {
                if ((crc & 1) == 1) {
                    crc >>= 1;
                    crc ^= 0xa001;
                } else {
                    crc >>= 1;
                }
            }

        }
        if (bytes[bytes.length - 1] == (byte) (crc >> 8) &&
                bytes[bytes.length - 2] == (byte) crc) {
            return true;
        }
        return false;
    }


    /**
     * 计算异或和
     *
     * @param bytes
     */
    private static void checkXOR8(byte[] bytes) {
        byte result = 0;
        for (int i = 0; i < bytes.length - 1; i++) {
            result ^= bytes[i];
        }

        bytes[bytes.length - 1] = result;
    }


    public static boolean Tx522Datacomplete(byte[] data) {
        boolean temp = false;
        byte result = 0;
        if (data == null || data.length < 3) {
            return false;
        }
        for (int i = 1; i < data.length - 2; i++) {
            result ^= data[i];
        }
        result = (byte) ~result;
        if (result == data[data.length - 2]) {
            temp = true;
        }
        return temp;
    }


}
